package ar.edu.utn.frba.dds.tp.tests.filtros;

import java.math.BigDecimal;
import java.util.ArrayList;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import com.google.common.collect.Collections2;

import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.code.Asientos.ClaseAsiento;
import ar.edu.utn.frba.dds.tp.code.Asientos.EstadoAsiento;
import ar.edu.utn.frba.dds.tp.code.Asientos.UbicacionAsiento;
import ar.edu.utn.frba.dds.tp.code.filtros.PredicateClaseAsiento;
import ar.edu.utn.frba.dds.tp.code.filtros.PredicatePreciosMaxMin;
import ar.edu.utn.frba.dds.tp.code.filtros.PredicateSoloAsientosLibres;
import ar.edu.utn.frba.dds.tp.code.filtros.PredicateUbicacionAsiento;


public class FiltrosTests {
	
	
	PredicateClaseAsiento filtroClaseTuristaPrimera;
	PredicateClaseAsiento filtroClaseEjecutiva;
	
	PredicatePreciosMaxMin filtroRangoPrecios;
	
	PredicateUbicacionAsiento filtroUbicacionPasillo;
	
	PredicateSoloAsientosLibres filtroAsientosLibres;
	
	ArrayList<AsientoDeVuelo> asientos;
	
	@Before
	public void setUp(){
		
		ArrayList<ClaseAsiento> clases = new ArrayList<ClaseAsiento>();
		
		ArrayList<ClaseAsiento> claseEjecutiva = new ArrayList<ClaseAsiento>();
		
		claseEjecutiva.add(ClaseAsiento.EJECUTIVA);
		
		clases.add(ClaseAsiento.TURISTA);
		clases.add(ClaseAsiento.PRIMERA);
		
		this.filtroClaseTuristaPrimera = new PredicateClaseAsiento(clases);
		this.filtroClaseEjecutiva = new PredicateClaseAsiento(claseEjecutiva);
		
		this.filtroRangoPrecios = new PredicatePreciosMaxMin(new BigDecimal(2000), new BigDecimal(500));
		
		this.filtroUbicacionPasillo = new PredicateUbicacionAsiento(UbicacionAsiento.PASILLO);
		
		this.filtroAsientosLibres = new PredicateSoloAsientosLibres();
		
		this.asientos = new ArrayList<AsientoDeVuelo>();
		
		this.asientos.add(new AsientoDeVuelo(100, new BigDecimal(1000), ClaseAsiento.EJECUTIVA, UbicacionAsiento.CENTRO, EstadoAsiento.DISPONIBLE));
		this.asientos.add(new AsientoDeVuelo(323, new BigDecimal(3000), ClaseAsiento.PRIMERA, UbicacionAsiento.CENTRO, EstadoAsiento.COMPRADO));
		this.asientos.add(new AsientoDeVuelo(302,new BigDecimal(1250),ClaseAsiento.TURISTA,UbicacionAsiento.VENTANA,EstadoAsiento.RESERVADO));
		this.asientos.add(new AsientoDeVuelo(932, new BigDecimal(400), ClaseAsiento.TURISTA, UbicacionAsiento.PASILLO, EstadoAsiento.DISPONIBLE));
		
	}
	
	@Test 
	public void testAsientosTuristaPrimera(){
		 Assert.assertEquals(3, Collections2.filter(this.asientos, this.filtroClaseTuristaPrimera).size());
	}
	
	@Test
	public void testAsientosEjecutiva(){
		Assert.assertEquals(1, Collections2.filter(this.asientos, this.filtroClaseEjecutiva).size());
	}
	
	@Test
	public void testAsientosRangoPrecios(){
		Assert.assertEquals(2, Collections2.filter(this.asientos, this.filtroRangoPrecios).size());
	}
	
	@Test
	public void testAsientosUbicacion(){
		Assert.assertEquals(1, Collections2.filter(this.asientos, this.filtroUbicacionPasillo).size());
	}
	
	@Test
	public void testAsientosSoloLibres(){
		Assert.assertEquals(2, Collections2.filter(this.asientos, this.filtroAsientosLibres).size());
	}
	
	@Test
	public void testAsientosTuristaPrimeraYPasillo(){
		Assert.assertEquals(1, Collections2.filter(Collections2.filter(this.asientos, this.filtroClaseTuristaPrimera), this.filtroUbicacionPasillo).size());
	}
}
